package gestoremulte.pack;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;

import javax.crypto.NoSuchPaddingException;
import javax.net.ssl.HostnameVerifier;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
/*
 * Si occupa della comunicazione sincrona per l'invio dell'annulla notifica e per l'autenticazione
 */
public class WebServiceSyncComunication {

	private String Url;
	public static final int ANNULLA_NOTIFICA = 1;
	public static final int AUTENTICAZIONE = 2;
	public static final int ACIPRA = 3;
	private int taskType;
	private boolean esitoComunicazione = false;
	private Context cont = null;
	private String nVerbaleAnnullaNotifica = "";
	private int tsFE;
    private int tsBE;
    private String targa;
    private int delayNet;
	
	
	WebServiceSyncComunication(String Url,int task, Context c){
		this.Url = Url;
		this.taskType = task;
		this.cont = c;
		
		
	}
	
	
	
	public String Comunicazione(){
		
		
		String result = "";
		
        
		HttpClient httpclient =getNewHttpClient();
		HttpResponse response = null;
		 
		
        switch (taskType) {
        
            case AUTENTICAZIONE:
            	JSONObject jsonAutenticazione = new JSONObject();
		    	try {
		    		
		    		
					jsonAutenticazione.put("matricola_agente",VariabiliCondiviseApplication.matricola);
				
		    	jsonAutenticazione.put("codice_agente", VariabiliCondiviseApplication.codice);
		    	jsonAutenticazione.put("IMEI",VariabiliCondiviseApplication.IMEI);
	    	
		    	StringEntity entityAutenticazione = new StringEntity( jsonAutenticazione.toString());  
		       	HttpPost httppostAutenticazione = new HttpPost(Url);
		      
		       	entityAutenticazione.setContentType("application/json;charset=UTF-8");
		     //  	entityAutenticazione.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
		       	httppostAutenticazione.setEntity(entityAutenticazione);
		        Log.e("Arrivato", "1");
		        delayNet = (int) System.currentTimeMillis();
		       	response = httpclient.execute(httppostAutenticazione);
		        delayNet = (int) (System.currentTimeMillis() - delayNet);
		        
		       	Log.e("Arrivato", "2");
	       	
		       	} catch (JSONException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
					Toast toast2 =Toast.makeText(cont, "Comunicazione non riuscita",Toast.LENGTH_LONG);
		    		toast2.show();
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Toast toast2 =Toast.makeText(cont, "Comunicazione non riuscita",Toast.LENGTH_LONG);
		    		toast2.show();
				} catch (ClientProtocolException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Toast toast2 =Toast.makeText(cont, "Comunicazione non riuscita",Toast.LENGTH_LONG);
		    		toast2.show();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Toast toast2 =Toast.makeText(cont, "Comunicazione non riuscita",Toast.LENGTH_LONG);
		    		toast2.show();
				}
		    	AnalyzeResponse(response);
		    	
		    	
		    	break;
		    	
            case ANNULLA_NOTIFICA:
            	
            	JSONObject jsonAnnullaNotifica = new JSONObject();
            	try {
            	jsonAnnullaNotifica.put("matricola_agente",VariabiliCondiviseApplication.matricola);
            	jsonAnnullaNotifica.put("codice_agente", VariabiliCondiviseApplication.codice);
            	jsonAnnullaNotifica.put("IMEI",VariabiliCondiviseApplication.IMEI);
            	jsonAnnullaNotifica.put("nverbale", nVerbaleAnnullaNotifica);
            	
            	StringEntity entityAnnullaNotifica = new StringEntity( jsonAnnullaNotifica.toString());  
	           	HttpPost httppostAnnullaNotifica = new HttpPost(Url);
	           	
	           	entityAnnullaNotifica.setContentType("application/json;charset=UTF-8");
	           //	entityAnnullaNotifica.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
	           	httppostAnnullaNotifica.setEntity(entityAnnullaNotifica);
	           	delayNet = (int) System.currentTimeMillis();
	           	response = httpclient.execute(httppostAnnullaNotifica);
	           	delayNet = (int) (System.currentTimeMillis() - delayNet);
	           	
            	} catch (JSONException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
					Toast toast2 =Toast.makeText(cont, "Comunicazione non riuscita",Toast.LENGTH_LONG);
		    		toast2.show();
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Toast toast2 =Toast.makeText(cont, "Comunicazione non riuscita",Toast.LENGTH_LONG);
		    		toast2.show();
				} catch (ClientProtocolException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Toast toast2 =Toast.makeText(cont, "Comunicazione non riuscita",Toast.LENGTH_LONG);
		    		toast2.show();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Toast toast2 =Toast.makeText(cont, "Comunicazione non riuscita",Toast.LENGTH_LONG);
		    		toast2.show();
				}
	           	
            	AnalyzeResponse(response);
            	break;
            	
            	
            case ACIPRA:
            	
            	JSONObject jsonACIPRA = new JSONObject();
			try {
				jsonACIPRA.put("matricola_agente",VariabiliCondiviseApplication.matricola);
				jsonACIPRA.put("codice_agente", VariabiliCondiviseApplication.codice);
            	jsonACIPRA.put("IMEI",VariabiliCondiviseApplication.IMEI);
            	jsonACIPRA.put("targa", targa);
            	
            	StringEntity entityACIPRA = new StringEntity( jsonACIPRA.toString());  
	           	HttpPost httppostACIPRA = new HttpPost(Url);
	           	
	           	entityACIPRA.setContentType("application/json;charset=UTF-8");
		           //	entityAnnullaNotifica.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
	           	httppostACIPRA.setEntity(entityACIPRA);
	           	delayNet = (int) System.currentTimeMillis();
	           	response = httpclient.execute(httppostACIPRA);
	           	delayNet = (int) (System.currentTimeMillis() - delayNet);
	           	
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            	
			AnalyzeResponseACIPRA(response);
            	break;
            }
	    	
        return result;
	}
	
	private void AnalyzeResponseACIPRA(HttpResponse response){
		String result = "";
		
	    if (response == null) {
       		result =  "Comunicazione non riuscita";
       		
	    }
	    
       	else if(response.getStatusLine().getStatusCode()!=200){
    		Log.d("risultato comunicazione", ""+response.getStatusLine().getStatusCode());
    		result = "Comunicazione non riuscita";
    		
       	} 
	    
       	else{
			try {
				result = inputStreamToString(response.getEntity().getContent());
			} catch (IllegalStateException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
       	}
	    
	    if (result!=null){
	    	
	    	
    		if (result.equals("Comunicazione non riuscita")){
    			
    			Toast toast2 =Toast.makeText(cont, result,Toast.LENGTH_LONG);
	    		toast2.show();
    		}
    		else{
    			JSONObject object = null;
	    		
    			
	    			try {
						object = (JSONObject) new JSONTokener(result).nextValue();
						int esito_operazione = object.getInt("esito_operazione");
						
						String codice_errore = object.getString("codice_errore");
						String messaggio_errore = object.getString("info");
						if (esito_operazione == 200){
							
							esitoComunicazione = true;
							String esito_visura = object.getString("esito_visura");
							tsFE = object.getInt("tsFE");
							tsBE = object.getInt("tsBE");
							
							delayNet -= (tsFE+tsBE);
							Log.e("DELAYNet",""+delayNet );
							Log.e("tsFE",""+tsFE );
							Log.e("tsBE",""+tsBE );
							if (esito_visura.equals("OK")){
								Toast toast =Toast.makeText(cont, "La visura è andata a buon fine e i dati sono stati ottenuti",Toast.LENGTH_LONG);
								toast.show();
								EncryptionDecription saveData = new EncryptionDecription();
								
								
								Log.e("denominazione", object.getString("denominazione"));
								Log.e("comune_nascita", object.getString("comune_nascita"));
								Log.e("provincia_nascita", object.getString("provincia_nascita"));
								Log.e("data_nascita", object.getString("data_nascita"));
								Log.e("residenza", object.getString("residenza"));
								Log.e("provincia_residenza", object.getString("provincia_residenza"));
								
								RispostaACIPRA rispostaACI = new RispostaACIPRA (object.getString("denominazione"),object.getString("comune_nascita"), object.getString("provincia_nascita"), object.getString("data_nascita"), object.getString("residenza"),object.getString("provincia_residenza") );
								
								saveData.encryptSaveACIPRA(rispostaACI, targa);
							}
							else{
								Toast toast = Toast.makeText(cont, "Non sono presenti informazioni relative alla targa. Controllare se si è digitato tutto correttamente",Toast.LENGTH_LONG);
								toast.show();
							}
						}
						else{
							Log.e("esito_operazione", ""+esito_operazione);
							Log.e("codice_errore", codice_errore);
							Log.e("info", messaggio_errore);
						}
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (InvalidKeyException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (NoSuchAlgorithmException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (NoSuchPaddingException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}	
    		}
	    }
	    		
	    
	    
	}
	
	private void AnalyzeResponse(HttpResponse response){
		String result = "";
		
	    if (response == null) 
       		result =  "Comunicazione non riuscita";
	    
       	else if(response.getStatusLine().getStatusCode()!=200){
    		Log.d("risultato comunicazione", ""+response.getStatusLine().getStatusCode());
    		result = "Comunicazione non riuscita";
       	} 
	    
       	else{
			try {
				result = inputStreamToString(response.getEntity().getContent());
			} catch (IllegalStateException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
       	}
	    
    	if (result!=null){
	    	
		    	
    		if (result.equals("Comunicazione non riuscita")){
    			
    			Toast toast2 =Toast.makeText(cont, result,Toast.LENGTH_LONG);
	    		toast2.show();
    		}
    		else{
    			JSONObject object = null;
	    		try {
	    			
	    			object = (JSONObject) new JSONTokener(result).nextValue();
					int esito_operazione = object.getInt("esito_operazione");
					
					String codice_errore = object.getString("codice_errore");
					String messaggio_errore = object.getString("info");
					Log.e("PROVA", "entato");
					if (esito_operazione == 200){
						esitoComunicazione = true;
						Log.e("PROVA", "entato3");
						Toast toast =Toast.makeText(cont, "operazione andata a buon fine",Toast.LENGTH_LONG);
						toast.show();
						tsFE = object.getInt("tsFE");
						tsBE = object.getInt("tsBE");
						
						delayNet -= (tsFE+tsBE);
						Log.e("DELAYNet",""+delayNet );
						Log.e("tsFE",""+tsFE );
						Log.e("tsBE",""+tsBE );
					}
					else{
						Toast toast =Toast.makeText(cont,"Errore: " + codice_errore + "- " + messaggio_errore,Toast.LENGTH_LONG);
				    	toast.show();
				    	esitoComunicazione = false;
					}
					
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					esitoComunicazione = false;
				}
    		}
    	}
    	
    	
			            
	}
	
	private String inputStreamToString(InputStream is) {

        String line = "";
        StringBuilder total = new StringBuilder();

        // Wrap a BufferedReader around the InputStream
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));

        try {
            // Read response until the end
            while ((line = rd.readLine()) != null) {
                total.append(line);
            }
        } catch (IOException e) {
            Log.e("Errore", e.getLocalizedMessage(), e);
        }

        // Return full string
        return total.toString();
    }

	public String getUrl() {
		return Url;
	}

	public void setUrl(String url) {
		Url = url;
	}

	public int getTaskType() {
		return taskType;
	}

	public void setTaskType(int taskType) {
		this.taskType = taskType;
	}

	public boolean isEsitoComunicazione() {
		return esitoComunicazione;
	}

	public String getnVerbaleAnnullaNotifica() {
		return nVerbaleAnnullaNotifica;
	}

	public void setnVerbaleAnnullaNotifica(String nVerbaleAnnullaNotifica) {
		this.nVerbaleAnnullaNotifica = nVerbaleAnnullaNotifica;
	}
	
	private HttpClient getNewHttpClient() {
	    try {
	    	
	    	HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
	        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
	        trustStore.load(null, null);

	        MySSLSocketFactory sf = new MySSLSocketFactory(trustStore);
	        sf.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);

	        HttpParams params = new BasicHttpParams();
	        HttpConnectionParams.setConnectionTimeout(params, 30000);
	        HttpConnectionParams.setSoTimeout(params, 30000);

	        SchemeRegistry registry = new SchemeRegistry();
	        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
	        registry.register(new Scheme("https", sf, 443));

	        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

	        return new DefaultHttpClient(ccm, params);
	    } catch (Exception e) {
	        return new DefaultHttpClient();
	    }
	}



	public String getTarga() {
		return targa;
	}



	public void setTarga(String targa) {
		this.targa = targa;
	}

	
}
